﻿using System.Net.Http.Headers;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;

namespace SageKing.Blazor.OpenIdService;

public class ApiService
{
    private readonly IHttpClientFactory _httpClientFactory;
    private readonly AuthenticationStateProvider _authStateProvider;
    private readonly IHttpContextAccessor httpContextAccessor;

    public ApiService(IHttpClientFactory httpClientFactory, IHttpContextAccessor httpContextAccessor, AuthenticationStateProvider authStateProvider)
    {
        _httpClientFactory = httpClientFactory;
        _authStateProvider = authStateProvider;
        this.httpContextAccessor = httpContextAccessor;
    }

    public async Task<HttpResponseMessage> GetFromProtectedApiAsync(string endpoint)
    {
        // 1. 获取当前用户的认证状态和访问令牌
        var authState = await _authStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;
        // 注意：Blazor Server 中，令牌可能存储在 Cookie 或通过其他方式与身份关联，你可能需要从 Claims 中获取或通过其他服务获取实际的访问令牌（如AccessToken）[4](@ref)
        //httpContextAccessor.HttpContext.User = user;
        //var accessToken = await httpContextAccessor.HttpContext.GetTokenAsync("access_token"); // 在Blazor Server中，有时可能需要通过 IHttpContextAccessor 访问（需谨慎使用）

        // 2. 创建HttpClient并设置Bearer Token
        var client = _httpClientFactory.CreateClient(HttpClientConsts.HttpClientIssuerKey);
        // 假设你已将访问令牌存储在认证状态中（这需要你在登录时获取令牌并添加到Claims中）
        // 更常见的做法是：登录后从认证服务器获取access_token，然后将其保存（例如在内存或安全的存储中），并在需要时取出。
        // 这里演示从Claim获取（前提是你登录时存入了）
        var accessTokenClaim = user.FindFirst("access_token"); // 假设ClaimType为"access_token"
        if (accessTokenClaim != null)
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessTokenClaim.Value); // [2](@ref)
        }
        else
        {
            // 处理没有令牌的情况，可能需要重新认证
            // 例如：NavigationManager.NavigateTo("/login", forceLoad: true);
        }

        // 3. 发起请求
        try
        {
            var response = await client.GetAsync(endpoint);
            response.EnsureSuccessStatusCode(); // 确保响应成功
            return response;
        }
        catch (HttpRequestException ex)
        {
            // 处理请求异常（如网络问题、API返回错误等）
            // 例如，如果令牌过期，API可能返回401，你可能需要刷新令牌或跳转登录
            Console.WriteLine($"API请求错误: {ex.Message}");
            throw;
        }
    }
}
